import axios from "axios"
import store from "../store"
import { Toast } from "antd-mobile"
import { createBrowserHistory } from "history"
import { clearToken, setToken } from "./token"
export const customHistory = createBrowserHistory()

const baseURL = "http://toutiao.itheima.net/v1_0"

const http = axios.create({
  baseURL,
  timeout: 5000
})

// 请求拦截器
http.interceptors.request.use((config) => {
  // 获取token
  const { login } = store.getState()
  const { token } = login.token
  // const token = getToken()
  // 除了登录请求外，其他请求统一添加 token
  console.log(token)
  if (!config.url?.startsWith("/authorizations")) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
})

// http.interceptors.response.use(undefined, (error) => {
//   if (!error.response) {
//     // 网路超时
//     Toast.show({
//       content: "网络繁忙，请稍后再试",
//       duration: 1000
//     })
//     return Promise.reject(error)
//   }

//   if (error.response.status === 401) {
//     // 说明 token 过期了，登录超时，此时，就让重定向到登录页面，让用户重新登录
//     message.error("登录超时，请重新登录", 1, () => {
//       // push() 也可以通过第二个参数来指定路由跳转时携带的额外的信息
//       customHistory.push("/login", {
//         from: customHistory.location.pathname
//       })
//       // 触发退出 action，将 token 等清除
//       store.dispatch(logout())
//     })
//   }
//   return Promise.reject(error)
// })

http.interceptors.response.use(undefined, async (error) => {
  // 响应失败时，会执行此处的回调函数
  if (!error.response) {
    // 网路超时
    Toast.show({
      content: "网络繁忙，请稍后再试",
      duration: 1000
    })
    return Promise.reject(error)
  }

  // 在此处，通过 refresh_token 来换取新的 token
  if (error.response.status === 401) {
    try {
      // ...
      // 先判断 redux 中是否有 refresh_token
      const { refresh_token } = store.getState().login
      if (!refresh_token) {
        await Promise.reject(error)
      }
      const res = await axios.put(`${baseURL}/authorizations`, null, {
        headers: {
          Authorization: `Bearer ${refresh_token}`
        }
      })
      const tokens = {
        // token 是最新的，接口返回的
        token: res.data.data.token,
        // 因为接口没有返回新的 refresh_token，所以，需要使用原来的
        refresh_token
      }
      setToken(tokens)
      store.dispatch({ type: "login/token", payload: tokens })

      // 继续完成原来要执行的操作
      // 比如，在获取个人资料时，token 超时了，最终，在拿到最新的 token 后
      //      要继续获取个人资料
      // console.dir(error)
      // 可以通过 error.config 来拿到原来发送的请求的相关信息
      // 所以，要执行原来的操作，只需要将 error.config 重新请求一次即可
      // 注意：此处，一定要返回 Promise 的结果
      return http(error.config)
    } catch (e) {
      // 如果换取新 token 的过程中，代码出错了，一般就说明 refresh_token 失效了
      // 此时，就清空token然后返回登录页面
      // 注意：在直接分发 thunk action 时，会报类型错误
      // store.dispatch(logout())
      // 解决方式：先自己手动分发对象形式的 action 来实现退出
      store.dispatch({ type: "login/logout" })
      // 手动清理本地的 token
      clearToken()

      Toast.show({
        content: "登录超时，请重新登录",
        duration: 1000,
        afterClose: () => {
          customHistory.push("/login", {
            from: customHistory.location.pathname
          })
        }
      })

      return Promise.reject(error)
    }
  }
})
export { http }
